﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Model;
using DAO;

namespace RegraNegocio
{
    public class ProdutoBO
    {
        private static ProdutoBO singleton = null;

        private ProdutoBO() { }

        public static ProdutoBO getInstance() 
        {
            if (singleton == null) {
                singleton = new ProdutoBO();
            }

            return singleton;
        }

        public void gravar(Produto produto) {
            if (!this.isProdutoCadastrado(produto))
            {
                ProdutoDAO.getInstance().inserir(produto);
            }
            else {
                throw new Exception("Não foi possível efetuar a inserção, nome do produto já cadastrado!");
            }
        }

        private bool isProdutoCadastrado(Produto produto) {
            return ProdutoDAO.getInstance().verificarDescricaoProduto(produto);
        }

        public void editar(Produto produto){
            int quantidadeEstoque = this.recuperarQuantidadeEstoque(produto);

            if (produto.QuantidadeEstoque < quantidadeEstoque)
            {
                throw new Exception("Não é possível diminuir a quantidade de produtos manualmente!");
            }
            else {
                ProdutoDAO.getInstance().atualizar(produto);
            }

        }

        private int recuperarQuantidadeEstoque(Produto produto) {
            return ProdutoDAO.getInstance().verificaQuantidadeEstoque(produto);
        }

        public void excluir(Produto produto) {
            if (!this.hasVinculoPedido(produto))
            {
                ProdutoDAO.getInstance().excluir(produto);
            }
            else {
                throw new Exception("Não é possível excluir um produto que possui vínculos com Pedido!");
            }
        }

        private bool hasVinculoPedido(Produto produto) {
            return ProdutoDAO.getInstance().verificaPedidos(produto);
        }

        public List<Produto> recuperarProdutos(Produto produto) 
        {
            List<Produto> produtosRecuperados = null;

            produtosRecuperados = ProdutoDAO.getInstance().recuperarProdutos(produto);

            return produtosRecuperados;
        }

        public Produto consultarProduto(int codigo) 
        {
            Produto produto = new Produto(codigo);

            return ProdutoDAO.getInstance().consultar(produto);
        }

        public List<Produto> recuperarTodosProdutos() 
        {
            return ProdutoDAO.getInstance().recuperarTodosProdutos();
        }

        public bool verificarRetiradaEstoque(int codigoProduto, int quantidade) {
            bool validacao = true;

            int quantidadeEstoque = this.recuperarQuantidadeEstoque(new Produto(codigoProduto));

            if (quantidadeEstoque < quantidade) {
                validacao = false;
            }

            return validacao;
        }

        public void atualizarQuantidadeEstoqueProdutos(List<ItemPedido> items) 
        {
            int quantidadeAtual = 0;

            foreach (ItemPedido item in items)
            {
                quantidadeAtual = this.recuperarQuantidadeEstoque(new Produto(item.Produto.Codigo));

                ProdutoDAO.getInstance().atualizarQuantidadeEstoque(item.Produto.Codigo, (quantidadeAtual - item.Quantidade));
            }
        }

    }
}